データ表現とプログラミング 第6回

警告・エラーメッセージへの対応

パッケージインストールの際に出る警告メッセージ

インストール時のメッセージ

  • 既にインストール済みのパッケージに対して,install.package( )関数を適用すると,パッケージをアップデートするために再インストールするものと認識され, その際にRをリスタートするかを尋ねられます
  • リスタートしても特に問題がないことが多いので,Noを選択してください
    • Yesを選択すると,Rをリスタートして再度コマンドを実行することになるので,この警告が繰り返し出てきます

パッケージ読み込みの際に出るエラーメッセージ

パッケージ読み込み時のメッセージ
- library(パッケージ名1)を実行した際に出る,there is no package called 'パッケージ名2'というメッセージは, 指定したパッケージを実行する際に必要なパッケージが未インストールの場合表示されます
- there is no package called 'パッケージ名2'で表示されたパッケージをインストール&読み込みしてから,再度目的のパッケージを読み込んでください

第3章 プロットを作る

実習用のRProjectと第3章用のスクリプトファイルの作成

  1. 06_datavisフォルダを新規作成する
  2. RStudioでFile → NewProject… → Existing Directoryから,(1)で作成した06_datavisフォルダを選択し,RProjectを新規作成する
  3. プロジェクトの画面が開いたら,File → NewFile → RScriptで,RScriptファイルを新規作成する
  4. chap3_06.Rというファイル名でRScriptファイルを保存する
  • 第3章の実習のコマンドはchap3_06.R上に書いていく
  • データのcsvファイルなどは06_datavisフォルダに保存する

3.6 審美的要素はgeomでもマッピングできる

必要なパッケージとデータセットの読み込み

library("ggplot2")
library("gapminder")
library("tidyverse")

図3.16:geom_関数ごとの審美的要素のマッピング

  • 審美的要素(線,形,色)は,特定のgeom_要素に対しても適用できる
    • 散布図の点 (geom_point)のみを大陸ごとに色分けし,平滑化曲線 (geom_smooth)は大陸ごとに分けない
  • geom_関数の中で,mapping = aes(...)を使い,最初のggplot()関数で指定されたマッピングを更新できる
p <- ggplot(data = gapminder, 
            mapping = aes(x = gdpPercap, y = lifeExp)) # プロットに使うデータ,x軸,y軸の変数名を指定 

p + geom_point(mapping = aes(color = continent)) +   # 散布図を大陸ごとに色分け  
  geom_smooth(method = "loess") +    # 平滑化曲線を描く(局所回帰: locally estimated scatterplot smoothing)
  scale_x_log10()  # x軸を対数変換
## `geom_smooth()` using formula = 'y ~ x'

図 3.17: 連続量を色でマッピングする

  • 連続量に対して,色の審美的要素を指定することもできる

  • 各国の各年の人口 (pop変数) の対数値に対して色をマッピングする (人口に応じて散布図の点の色を変化させる)

    • 人口を対数に変換する操作はlog()関数を用いる
    • log()関数による変換は,aes()関数の引数の中でも実行可能
p <- ggplot(data = gapminder, 
            mapping = aes(x = gdpPercap, y = lifeExp)) #  プロットに使うデータ,x軸,y軸の変数名を指定 

p + geom_point(mapping = aes(color = log(pop))) + # 人口の対数値に散布図の点の色をマッピングさせる
  scale_x_log10()

凡例の読み取り

  • 凡例 (legend) から,プロットがどのように構成され,マップが何を含んでいるかの情報を読み取ることができる

図3.15と図3.16の凡例

  • 図3.15 (左)
    • 大陸 (continent) に対して点,線,背景が示されている
    • continentにcolor, fillをマッピングし,geom_point()関数と,それぞれの大陸に対する平滑化曲線 geom_smooth()関数を適用している
    • 点はcolorの指定,平滑化曲線はcolorfillの指定を受けているため,点・線・リボンの塗りつぶしの色が凡例に反映されている
  • 図3.16 (右)
    • 大陸 (continent) に対して点,線,背景が示されている
    • continentにcolorをマッピングし,geom_point()関数を適用している
    • 点にのみがcolorの指定を受けているため,点の塗りつぶしの色だけが凡例に反映されている

3.7 保存しよう

直近に作成したプロットを保存

  • ggsave()関数を使う

  • 直近に作成したプロットをpng形式で保存

    • my_figure.pngという名前で保存する場合
# プロットを作成 (図3.17と同一)
p <- ggplot(data = gapminder, 
            mapping = aes(x = gdpPercap, y = lifeExp))

p + geom_point(mapping = aes(color = log(pop))) + 
  scale_x_log10()

# 直近に作成したプロットの保存
ggsave(filename = "my_figure.png") # 保存するファイルの拡張子を.pngに指定  
## Saving 8 x 5 in image
  • プロジェクトフォルダ内に,プロットのファイルが作成される

保存されたプロットのファイル

  • 直近に作成したプロットをpdf形式で保存
    • my_figure.pdfという名前で保存する場合
ggsave(filename = "my_figure.pdf") # 保存するファイルの拡張子を.pdfに指定  
## Saving 8 x 5 in image
  • ggsave()関数のfilename =は最初に指定する場合は省略可能
ggsave("my_figure.pdf") # filename = を省略  
## Saving 8 x 5 in image

プロットが格納されたオブジェクトを指定して保存

  • p_outというオブジェクトにプロットを格納し,ggsave()関数でp_outを指定して保存する
    • my_figure.pdfという名前で保存する場合
p <- ggplot(data = gapminder, 
            mapping = aes(x = gdpPercap, y = lifeExp)) # プロットに使うデータ,x軸,y軸の変数名を指定 

p_out <- p + geom_point() +          # プロットをp_outというオブジェクトに格納
  geom_smooth(method = "loess") +
  scale_x_log10()

p_out # プロット(p_out)を表示
## `geom_smooth()` using formula = 'y ~ x'

ggsave(filename = "my_figure.pdf", plot = p_out) # p_outに格納されたプロットを,my_figure.pdfという名前で保存  
## Saving 8 x 5 in image
## `geom_smooth()` using formula = 'y ~ x'

図の名称

  • 図を保存するときは分かりやすい名称をつける
    • 簡潔で内容を表し,プロジェクトの中の図の名前は一貫している方が良い
  • 将来的にコードを詰まらせる可能性がある文字の使用は避ける
    • ', ', (スペース), \, /, "などはファイル名に含めない
    • ファイル名は半角英数とし,日本語は使用しない

図の保存場所

  • 図は,プロジェクト内に図の保存用サブフォルダ(figures)を作成し,そこに保存すると良い
    • 付録A.3:プロジェクトとファイルを管理するも参考
  • figureというサブフォルダを,プロジェクトファイル内に作成し,その中に図をまとめて保存する
  1. 06_datavisフォルダの中に,figuresというフォルダを新規作成する
    figureサブフォルダ

  2. hereパッケージを読み込む

  • hereパッケージを使うと,フォルダやサブフォルダをファイルパスを書かなくても簡単に取り扱うことができる

  • hereパッケージをinstall.packages()関数を用いてインストールする

    • 初回のみ,1回インストールしたら,次回以降はインストール不要
install.packages("here") # hereパッケージのインストール(初回のみ)
  • hereパッケージをlibrary関数で読み込む
    • パッケージの読み込みは,Rを起動したらその度に行う
library("here") # hereパッケージの読み込み  
## here() starts at /Users/tsugaru/Library/CloudStorage/GoogleDrive-nakamur0308@gmail.com/マイドライブ/TDU/TDU_非常勤/データ表現とプログラミング_2023/06
  1. hereパッケージで,保存先のフォルダを指定し,プロットを保存する
  • hereパッケージを使うと,現在のプロジェクトのフォルダを「here:この場所」として参照できる
  • 現在のプロジェクト(06_datavis)内のfiguresフォルダに,プロット (p_out)をlifeexp_gdp.pdfというファイル名で保存するように指定する
here() # 現在のプロジェクトフォルダの確認 
## [1] "/Users/tsugaru/Library/CloudStorage/GoogleDrive-nakamur0308@gmail.com/マイドライブ/TDU/TDU_非常勤/データ表現とプログラミング_2023/06"
ggsave(here("figures",           # figuresフォルダを指定
            "lifeexp_gdp.pdf"),   # 保存するファイル名と形式を指定
       plot = p_out)            # 保存するプロットが格納されたオブジェクトを指定
## Saving 8 x 5 in image
## `geom_smooth()` using formula = 'y ~ x'

図のフォーマット

  • 図はベクター形式 (vector), ラスター形式 (raster) の2つのフォーマットに大別できる

図のフォーマット

  • ベクター形式
    • pdf, svg
    • 数学的な形状(線、曲線、多角形など)を用いて画像を生成し,こうした情報は座標位置に関する数学的な式によって定義される  
    • 任意の大きさに拡大・縮小しても画質が劣化しない
    • ファイルサイズが大きくなる場合がある
  • ラスター形式
    • png, jpg
    • ピクセル(画素)ベースの形式であり,画像は色を持つ個々のピクセルの格子で表現される
    • 効率的な圧縮が可能で,pdfより容量を小さくできる傾向にある
    • リサイズが簡単にできず,拡大すると図がカクカクになったりする

プロットのサイズを指定して保存

  • ggsave()関数で保存する時のプロットの大きさは height =, width =引数で指定する
    • デフォルトの単位はインチ(1in = 2.5cm)
    • 単位をにミリメートル変更したい場合はunits = "mm", センチメートルに変更したい場合はunits = "cm"で指定
  • 現在のプロジェクト(06_datavis)内のfiguresフォルダに,プロット (p_out)をlifeexp_gdp.pdfというファイル名で, 高さ8センチ,横幅10センチで保存するように指定する
ggsave(here("figures", "lifeexp_gdp.pdf"), # ファイルを保存するフォルダと,ファイル名・形式を指定
       plot = p_out,   # 保存するプロットが格納されたオブジェクトを指定
       height = 8,     # プロットサイズの高さを指定
       width = 10,     # プロットサイズの横幅を指定
       units = "cm")   # プロットサイズの単位をセンチメートルに指定
## `geom_smooth()` using formula = 'y ~ x'

3.8  次の一手

  • gapminderデータセットに手を加えて,関数を実行した場合を比べてみる

第3章 練習問題

  • スタバの店舗数と関係が深い変数を調べる
    • 最初は「Hide」ボタンを押してコードを隠し,回答例を見ずに作図してみる

データの読み込み

  • Cafe_Stats.csvをWebClassからダウンロードし,06_datavisフォルダに保存する
  • read.csv関数を使い,Cafe_Stats.csvcafe_dataというオブジェクト名でRに読み込む  
cafe_data <- read.csv("Cafe_Stats.csv") # csvファイルを読み込む 
glimpse(cafe_data) # データフレームのヘッダーと最初の数行を表示  
## Rows: 47
## Columns: 9
## $ Chain             <chr> "Starbucks", "Starbucks", "Starbucks", "Starbucks", …
## $ Prefecture        <chr> "Hokkaido", "Aomori", "Iwate", "Miyagi", "Akita", "Y…
## $ Stores            <int> 44, 11, 8, 29, 8, 8, 10, 35, 27, 21, 80, 76, 379, 11…
## $ Population        <int> 5224614, 1237984, 1210534, 2301996, 959502, 1068027,…
## $ Population_U15    <int> 555804, 129112, 132447, 268428, 92673, 120086, 20615…
## $ Population_15to64 <int> 2945727, 676167, 658816, 1346845, 500687, 578819, 10…
## $ Population_O65    <int> 1664023, 412943, 404359, 638984, 357568, 359554, 572…
## $ Consumption_Exp   <int> 301683, 251881, 270902, 264817, 264922, 293536, 2680…
## $ Food_Exp          <int> 77680, 75325, 74023, 76291, 72763, 77254, 72590, 713…
cafe_data <- read.csv("https://raw.githubusercontent.com/HirokoCogPsy/TDU_DataVis2023/main/Cafe_Stats.csv")

練習問題 1: 食費とスタバの店舗数,人口の関係をプロットする

  • プロットのオブジェクト名をp_stb_1とする
  • x軸に食費 (Food_Exp), y軸に店舗数 (Stores)をとった散布図を作成する
  • 各県の人口 (Population) の対数値に対して色をマッピングする
  • GAM平滑化曲線を描画する
  • 食費と店舗数はlog10の対数変換を行う
# データとマッピングする変数を指定
p_stb_1 <- ggplot(data = cafe_data, mapping = aes(x = Food_Exp, y = Stores)) 

# 散布図と平滑化線を描画しp_stb_1に格納
p_stb_1 <- p_stb_1 + geom_point(mapping = aes(color = log(Population))) + # 人口の対数値に散布図の点の色をマッピングさせる)
    scale_x_log10() + 
    scale_y_log10() +
    geom_smooth(method = "gam")

p_stb_1 # プロットを表示
## `geom_smooth()` using formula = 'y ~ s(x, bs = "cs")'

  • 現在のプロジェクト(06_datavis)内のfiguresフォルダに,プロット (p_stb_1)をstb_plot1.pngというファイル名で, 高さ8センチ,横幅10センチで保存するように指定する
ggsave(here("figures", "stb_plot1.png"), # ファイルを保存するフォルダと,ファイル名・形式を指定
       plot = p_stb_1,   # 保存するプロットが格納されたオブジェクトを指定
       height = 8,     # プロットサイズの高さを指定
       width = 10,     # プロットサイズのの横幅を指定
       units = "cm") 
## `geom_smooth()` using formula = 'y ~ s(x, bs = "cs")'

練習問題 2: 消費支出に占める食費の割合とスタバの店舗数,人口の関係をプロットし保存する

食費の割合の変数の追加

  • 消費支出(Consumption_Exp)に占める食費 (Food_Exp)の割合(%)を計算し,データセットcafe_dataに,新たな変数Food_Exp_Rateを追加する

  • データセット名$変数名でデータセットの中の特定の変数を取り出すことができる

  • データセットに新しい変数を付け加えたい場合は,データセット名$新しい変数名 <- ベクトルで,新しい変数に格納するベクトルを指できる

# 消費支出に占める食費の割合を計算し,cafe_dataの新たな変数Food_Exp_Rateに格納する  
cafe_data$Food_Exp_Rate <- 
  (cafe_data$Food_Exp / cafe_data$Consumption_Exp) * 100

glimpse(cafe_data) # データフレームのヘッダーを表示し,Food_Exp_Rate変数が追加されているか確認
## Rows: 47
## Columns: 10
## $ Chain             <chr> "Starbucks", "Starbucks", "Starbucks", "Starbucks", …
## $ Prefecture        <chr> "Hokkaido", "Aomori", "Iwate", "Miyagi", "Akita", "Y…
## $ Stores            <int> 44, 11, 8, 29, 8, 8, 10, 35, 27, 21, 80, 76, 379, 11…
## $ Population        <int> 5224614, 1237984, 1210534, 2301996, 959502, 1068027,…
## $ Population_U15    <int> 555804, 129112, 132447, 268428, 92673, 120086, 20615…
## $ Population_15to64 <int> 2945727, 676167, 658816, 1346845, 500687, 578819, 10…
## $ Population_O65    <int> 1664023, 412943, 404359, 638984, 357568, 359554, 572…
## $ Consumption_Exp   <int> 301683, 251881, 270902, 264817, 264922, 293536, 2680…
## $ Food_Exp          <int> 77680, 75325, 74023, 76291, 72763, 77254, 72590, 713…
## $ Food_Exp_Rate     <dbl> 25.74888, 29.90499, 27.32464, 28.80895, 27.46582, 26…

プロットの作成

  • プロットのオブジェクト名をp_stb_2とする
  • x軸に消費支出(Consumption_Exp)に占める食費 (Food_Exp)の割合, y軸に店舗数 (Stores)をとった散布図を作成する
  • 各県の人口 (Population) の対数値に対して色をマッピングする
  • GAM平滑化曲線を描画する
  • 店舗数はlog10の対数変換を行う
  • プロットのタイトルや軸名をlabs()関数で調整する
    • タイトルをPercentage of food expenses and number of Starbucks stores
    • x軸名をPercentage of food expenses in consumption expenditure (%)
    • y軸名をNumber of Starbucks stores
# データとマッピングする変数を指定
p_stb_2 <- ggplot(data = cafe_data, 
                  mapping = aes(x = Food_Exp_Rate, y = Stores)) 

# 散布図と平滑化線を描画
p_stb_2 <- p_stb_2 +
  geom_point(mapping = aes(color = log(Population))) + # 人口の対数値に散布図の点の色をマッピングさせる)
  scale_y_log10() +
  geom_smooth(method = "gam") + 
  labs(title = "Percentage of food expenses and number of Starbucks stores",
       x = "Percentage of food expenses in consumption expenditure (%)", 
       y = "Number of Starbucks stores")

p_stb_2
## `geom_smooth()` using formula = 'y ~ s(x, bs = "cs")'

プロットの保存

  • 現在のプロジェクト(06_datavis)内のfiguresフォルダに,プロット (p_stb_2)をstb_plot2.pngというファイル名で, 高さ8センチ,横幅10センチで保存するように指定する
ggsave(here("figures",           # figuresフォルダを指定
            "stb_plot2.png"),   # 保存するファイル名と形式を指定
       plot = p_stb_2,   # 保存するプロットが格納されたオブジェクトを指定
       height = 8,     # プロットサイズの高さを指定
       width = 10,     # プロットサイズのの横幅を指定
       units = "cm")   # プロットサイズの単位をセンチメートルに指定) 
## `geom_smooth()` using formula = 'y ~ s(x, bs = "cs")'

おまけ:散布図の各点にラベルを追加する

  • ggrepelパッケージを使うと,テキストの位置を自動的に調整し配置してくれる

  • ggrapelgeom_text_repel(aes(label= ))のlabel=に,配置したい変数を指定する

  • 県名を表示した散布図の例  

install.packages("ggrepel")
## 
## The downloaded binary packages are in
##  /var/folders/jf/gv6x13dx54v02vpc5x4qhljm0000gn/T//Rtmp3dQlaj/downloaded_packages
library("ggrepel")

# 散布図を描画
p_stb_2 + 
  geom_point(mapping = aes(color = log(Population))) + 
  scale_y_log10() +
  ggrepel::geom_text_repel(aes(label=Prefecture)) #散布図の点に県名をマッピング  
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## `geom_smooth()` using formula = 'y ~ s(x, bs = "cs")'

  • 2007年の一人当たりGDPと平均寿命
## `geom_smooth()` using formula = 'y ~ x'
## Warning: ggrepel: 61 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

第4章 正しい数値の示し方

  • 本章の主な目的

    • 作図のための新たなgeomの使い方を学び,色々な図を作れるようになる
    • 図を作成する際に,ggplotが何をしているのかについての理解を深める
    • 作図にあたってデータを前処理するためのコードの書き方を紹介する
  • 新しい言語を習得する際は,コードをコピー&ペーストするのではなく,実際にコードを手入力して実行することが重要

    • Rの構文がどのように働き,どこでエラーが発生しやすいのかが理解しやすくなる
    • 大抵のエラーは調べれば原因を特定できる
  • 本章では,ggplotの便利な機能が,同時に誤りの原因にもなりうる点について解説する

  • データを複数の図に分割する方法,図を作る前にggplotでデータを計算・要約する方法についての解説も行う  

4.1 文法としては正しいが意味をなさない

  • ggplotはWilkinson (2005) によるグラフィックスの文法 (grammar of graphics) という,データから図を作成するための一連の規則を実装したパッケージ
    • データを分割して,色・位置・大きさを適切に設定した線や点に落とし込む
    • スムージングや対数変換のようなデータの加工,座標系へのデータの投影など

_ プログラミングコードの文法は伝えられる物事の構造を制限するが,文法それ自体が自動的に伝えたいことを意味づけ,分かりやすくしてくれるわけではない
- データの可視化には,データのマッピングから始まる長いコードを記述する必要がある

  • Rから図が出力されても,意図したものではない図が出力される場合もある
    • ggplotの文法としては正しくても,記述した内容が無意味か,コードの意図が誤ってggplotに伝わっている

第4章用のスクリプトファイルの作成

  1. File → NewFile → RScriptで,RScriptファイルを新規作成する
  2. chap4_06.Rというファイル名でRScriptファイルを保存する
  • 第4章の実習のコマンドはchap4_06.R上に書いていく
  • データのcsvファイルなどは06_datavisフォルダに保存する

4.2 グループ別データに対する審美的要素

図4.1: 国ごとに時系列データを示そうとしたが…

  • gapminderデータセットを例に取り上げ,各国の1人あたりGDPの時間的推移を可視化する
  • x軸に年 (year), y軸に1人あたりGDP (gdpPercap)をマッピング
  • geom_line()関数で,プロットを作成
library("gapminder") # gapminderの読み込み

# x軸に年 (`year`), y軸に1人あたりGDP (`gdpPercap`)をマッピング
p <- ggplot(data = gapminder,
            mapping = aes (x = year,
                           y = gdpPercap))

# geom_line関数でプロットを作成  
p + geom_line()

- 図4.1 は意図した図とは違う図になっている

  • データが国別に分かれていることを指定していないため,geom_line関数はデフォルトのまま,年代でデータを送別し,国ごとに区別して作図していない

  • yeargdpPercapのみの指定では,1行目のデータがアフガニスタンのもの,といったcountry`の情報が分からない 

## # A tibble: 6 × 3
##   country      year gdpPercap
##   <fct>       <int>     <dbl>
## 1 Afghanistan  1952      779.
## 2 Afghanistan  1957      821.
## 3 Afghanistan  1962      853.
## 4 Afghanistan  1967      836.
## 5 Afghanistan  1972      740.
## 6 Afghanistan  1977      786.
  • 1952年には複数の国のデータがある
## # A tibble: 6 × 3
##   country      year gdpPercap
##   <fct>       <int>     <dbl>
## 1 Afghanistan  1952      779.
## 2 Albania      1952     1601.
## 3 Algeria      1952     2449.
## 4 Angola       1952     3521.
## 5 Argentina    1952     5911.
## 6 Australia    1952    10040.
  • 図4.1から得られる情報は,gapminderデータをきちんと反映したものではない
    • ggplotは探索的に図を作るので,途中でおかしな図が出たり,ミスが生じる事はよくある
  • ggplotのおかしな図は,geom_関数中のデータと審美的要素のマッピングがうまくいっていない場合がほとんど

図4.2: 国ごとの時系列データの可視化に再挑戦

  • 国別の構造をグループとして利用する
    • geom_line()関数に,国別でグループ化するようマッピングを指定することで,個々の国ごとに個別のラインをプロットできる
    • geom_line(mapping = aes (group = country))
# x軸に年 (`year`), y軸に1人あたりGDP (`gdpPercap`)をマッピング
p <- ggplot(data = gapminder,
            mapping = aes (x = year,
                           y = gdpPercap))

# geom_line関数のmapping引数で,countryごとにグループ化し国ごとにラインを引くよう指定 
p + geom_line(mapping = aes(group = country))

  • グループとして使いたい情報がggplotでマッピングすべき変数として読み込まれていない場合は,group引数を使って審美的要素にグループの情報を明記する必要がある

4.3 複数の図を並べるためのfacet_関数群

  • 図4.2はたくさんの線が描かれているため,それぞれの傾向を細かく見るには適切な図とは言えない  

  • 変数をfacet(対象の変数ごとに図を切り出し,パネル形式で出力する関数)として利用し,選択した変数に基づいてデータを送別化し,複数の図を並べたパネル形式の図を作る

    • facetを使うと,大量のデータを一貫した手法でコンパクトに図で出力できる
    • facet_関数群は一覧のgeomをまとめて取り扱うための手法

図4.3 大陸ごとのfacet適用

  • 大陸(continent)ごとに層別化したプロットを作るため,facet_wrap()関数のfacet引数に大陸を指定する

  • facet_wrap()関数は,Rのformula記法チルダ(“~”)を用いて第1引数を指定する

    • formula記法: 統計モデリングのための記法で,チルダ()は「をモデル化する」という意味を持つ。左側には従属変数(予測したい変数)を、右側には独立変数(予測に使用する変数)を置く
  • facet_wrap(~ continent)のように,formulaに単一の変数としてcontinentのみを指定し,大陸ごとにプロットを出力する

# x軸に年 (`year`), y軸に1人あたりGDP (`gdpPercap`)をマッピング
p <- ggplot(data = gapminder,
            mapping = aes(x = year,
                          y = gdpPercap))

# countryごとにグループ化し国ごとにラインを引くよう指定 
p + geom_line(aes(group = country)) +
  facet_wrap(~ continent) # 大陸ごとにプロットを出力するよう指定

  • 大陸ごとに層化された図には, facet_wrap()関数の引数である各大陸のラベルが記されている  

図4.4 大陸ごとのfacet適用 (図4.3の改良版)

  • facetで階層化したそれぞれの図に対しても,geom_関数を適用できる

  • facet_wrap() 関数のncol引数の数値を編集することで,図の列数を変更できる

  • 図の見た目をスムーズにするため,線の色を変更することも可能

  • 図4.3を改良する

    • facet_wrap() 関数の引数ncol = 5とし,1行5列で出力
    • `geom_line (color = “gray70”)とし,線の色を灰色にする
    • 平滑化曲線を局所回帰 (loess)で描画する。その際,線の太さを1.1ポイントに指定 し(size = 1.1),信頼区間は描画しない (se = FALSE)
    • y軸をlog10の対数変換し,labels = scales:dollarでドル表記にする
    • labs()関数で適切なグラフタイトルや軸名をつける
# x軸に年 (`year`), y軸に1人あたりGDP (`gdpPercap`)をマッピング
p <- ggplot(data = gapminder, 
            mapping = aes(x = year, y = gdpPercap))

# 図4.3を改良したプロットを描画する  
p + geom_line(color="gray70", 
              mapping = aes(group = country)) +
    geom_smooth(size = 1.1, 
                method = "loess", 
                se = FALSE) +
    scale_y_log10(labels=scales::dollar) +
    facet_wrap(~ continent, ncol = 5) +
    labs(x = "Year",
         y = "GDP per capita",
         title = "GDP per capita on Five Continents")
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## `geom_smooth()` using formula = 'y ~ x'

図4.5 変数をfacetに利用した場合の例 (年齢と子供の数,人種と性別で層別化)

  • facet_grid()関数を使い,2種類のカテゴリカル変数をもとにデータを分類する
     - 人種(White, Black, Other)と性別 (Male, Female)ごとに,年齢と子供の数の関係をプロットする

パッケージのインストール

  • install.packages()関数でsocvizパッケージをダウンロードする (初回のみ)
install.packages("socviz") # パッケージのダウンロード
## 
## The downloaded binary packages are in
##  /var/folders/jf/gv6x13dx54v02vpc5x4qhljm0000gn/T//Rtmp3dQlaj/downloaded_packages
  • library()関数でsocvizパッケージを読み込む (RStudio起動時)
  • socvizパッケージに入っている,gss_smデータを用いて図4.5を作図する
library("socviz") #パッケージの読み込み

glimpse(socviz::gss_sm) #gss_smデータセットの最初の数行を表示  
## Rows: 2,867
## Columns: 32
## $ year        <dbl> 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016…
## $ id          <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,…
## $ ballot      <labelled> 1, 2, 3, 1, 3, 2, 1, 3, 1, 3, 2, 1, 2, 3, 2, 3, 3, 2,…
## $ age         <dbl> 47, 61, 72, 43, 55, 53, 50, 23, 45, 71, 33, 86, 32, 60, 76…
## $ childs      <dbl> 3, 0, 2, 4, 2, 2, 2, 3, 3, 4, 5, 4, 3, 5, 7, 2, 6, 5, 0, 2…
## $ sibs        <labelled> 2, 3, 3, 3, 2, 2, 2, 6, 5, 1, 4, 4, 3, 6, 0, 1, 3, 8,…
## $ degree      <fct> Bachelor, High School, Bachelor, High School, Graduate, Ju…
## $ race        <fct> White, White, White, White, White, White, White, Other, Bl…
## $ sex         <fct> Male, Male, Male, Female, Female, Female, Male, Female, Ma…
## $ region      <fct> New England, New England, New England, New England, New En…
## $ income16    <fct> $170000 or over, $50000 to 59999, $75000 to $89999, $17000…
## $ relig       <fct> None, None, Catholic, Catholic, None, None, None, Catholic…
## $ marital     <fct> Married, Never Married, Married, Married, Married, Married…
## $ padeg       <fct> Graduate, Lt High School, High School, NA, Bachelor, NA, H…
## $ madeg       <fct> High School, High School, Lt High School, High School, Hig…
## $ partyid     <fct> "Independent", "Ind,near Dem", "Not Str Republican", "Not …
## $ polviews    <fct> Moderate, Liberal, Conservative, Moderate, Slightly Libera…
## $ happy       <fct> Pretty Happy, Pretty Happy, Very Happy, Pretty Happy, Very…
## $ partners    <fct> NA, "1 Partner", "1 Partner", NA, "1 Partner", "1 Partner"…
## $ grass       <fct> NA, Legal, Not Legal, NA, Legal, Legal, NA, Not Legal, NA,…
## $ zodiac      <fct> Aquarius, Scorpio, Pisces, Cancer, Scorpio, Scorpio, Capri…
## $ pres12      <labelled> 3, 1, 2, 2, 1, 1, NA, NA, NA, 2, NA, NA, 1, 1, 2, 1, …
## $ wtssall     <dbl> 0.9569935, 0.4784968, 0.9569935, 1.9139870, 1.4354903, 0.9…
## $ income_rc   <fct> Gt $170000, Gt $50000, Gt $75000, Gt $170000, Gt $170000, …
## $ agegrp      <fct> Age 45-55, Age 55-65, Age 65+, Age 35-45, Age 45-55, Age 4…
## $ ageq        <fct> Age 34-49, Age 49-62, Age 62+, Age 34-49, Age 49-62, Age 4…
## $ siblings    <fct> 2, 3, 3, 3, 2, 2, 2, 6+, 5, 1, 4, 4, 3, 6+, 0, 1, 3, 6+, 2…
## $ kids        <fct> 3, 0, 2, 4+, 2, 2, 2, 3, 3, 4+, 4+, 4+, 3, 4+, 4+, 2, 4+, …
## $ religion    <fct> None, None, Catholic, Catholic, None, None, None, Catholic…
## $ bigregion   <fct> Northeast, Northeast, Northeast, Northeast, Northeast, Nor…
## $ partners_rc <fct> NA, 1, 1, NA, 1, 1, NA, 1, NA, 3, 1, NA, 1, NA, 0, 1, 0, N…
## $ obama       <dbl> 0, 1, 0, 0, 1, 1, NA, NA, NA, 0, NA, NA, 1, 1, 0, 1, 0, 1,…
  • gss_sm: 2016年の総合社会調査(General Social Survey)の一部を抽出したデータセット
    • 多くのカテゴリカル変数が含まれている(例:人種,性別,所得の範囲)

図 4.5

  • 年齢 (age) と子供の数(childs)を散布図で表す
    • 平滑化曲線を示す
  • facetを用いて,性別(sex)・人種(race)で層別化した上で,散布図を示す
    • facet_grid(sex ~ race)とし,sexraceごとにプロットを出力する
# x軸に年齢 (`age`), y軸に子供の数 (`childs`)をマッピング
p <- ggplot(data = gss_sm,
            mapping = aes(x = age, y = childs))

# 散布図と平滑化曲線を描画
p + geom_point(alpha = 0.2) +
    geom_smooth() +
    facet_grid(sex ~ race) # 性別と人種で層別化しプロットを出力
## `geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'
## Warning: Removed 18 rows containing non-finite values (`stat_smooth()`).
## Warning: Removed 18 rows containing missing values (`geom_point()`).

  • マルチパネル形式でレイアウトされた図は,2つ以上のカテゴリカル変数にまたがる連続変数の変化を可視化する場合に役立つ 

第4章 練習問題

  • 高齢者(65歳以上)の人口の推移を県・地域ごとに見る

データの読み込み

pref_data <- read.csv("Prefectures_Stats_all.csv")

glimpse(pref_data) # データフレームのヘッダーと最初の数行を表示  
## Rows: 564
## Columns: 46
## $ Year                                 <int> 2009, 2009, 2009, 2009, 2009, 200…
## $ Area_Code                            <chr> "R01000", "R02000", "R03000", "R0…
## $ Prefecture                           <chr> "hokkaido", "aomori", "iwate", "m…
## $ Area                                 <chr> "Hokkaido_Tohoku", "Hokkaido_Toho…
## $ Population                           <int> 5524000, 1383000, 1340000, 234800…
## $ Population_M                         <int> 2612000, 651000, 640000, 1139000,…
## $ Population_F                         <int> 2911000, 732000, 700000, 1208000,…
## $ Populatioin_Japanese                 <int> 5506000, 1380000, 1335000, 233600…
## $ Population_U15                       <int> 663000, 173000, 169000, 314000, 1…
## $ Population_15to64                    <int> 3510000, 862000, 813000, 1506000,…
## $ Population_O65                       <int> 1334000, 344000, 359000, 515000, …
## $ Number_of_Birth                      <int> 40165, 9523, 9904, 18988, 7013, 8…
## $ Total_Fertility_Rate                 <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
## $ Number_of_Death                      <int> 53221, 15387, 15410, 20808, 13866…
## $ Immigrants_Japanese                  <int> 51598, 20700, 18642, 49058, 13670…
## $ Out_Immigrant_Japanese               <int> 63776, 27299, 24185, 50985, 18219…
## $ Marriage                             <int> 28271, 6067, 5900, 12217, 4364, 5…
## $ Divorce                              <int> 12294, 2768, 2429, 4522, 1708, 19…
## $ Temperature_Average                  <int> 9, 11, 11, 13, 12, 12, 14, 14, 15…
## $ Temperature_Max                      <int> 25, 26, 27, 27, 28, 29, 29, 29, 3…
## $ Temperature_Min                      <int> -6, -4, -5, -1, -2, -3, -1, -1, -…
## $ Precipitation                        <int> 1147, 1460, 1275, 1304, 1729, 100…
## $ Kndergarten_Children_Number          <int> 66181, 9721, 13123, 32910, 8713, …
## $ Nursery_School_Children              <int> 62584, 33465, 26272, 27086, 22313…
## $ Elementary_School_Teachers           <int> 19786, 5489, 5504, 8231, 3936, 45…
## $ Elementary_School_Students           <int> 278684, 76894, 73284, 129708, 540…
## $ Junior_High_School_Teachers          <int> 12587, 3412, 3316, 4900, 2458, 26…
## $ Junior_High_School_Students          <int> 149060, 42567, 39391, 66506, 3061…
## $ High_School_Teachers                 <int> 11629, 3390, 3215, 4747, 2515, 28…
## $ High_School_Students                 <int> 145442, 42078, 40097, 64048, 3021…
## $ University_Teachers                  <int> 6392, 1224, 1341, 4460, 952, 1016…
## $ University_Students                  <int> 80917, 14779, 11681, 49627, 8226,…
## $ University_Graduates                 <int> 17495, 3341, 2425, 10901, 1848, 2…
## $ Waste_Per_Person                     <int> 1037, 1049, 922, 983, 983, 909, 1…
## $ Recycling_Waste_Rate                 <int> 20, 13, 19, 18, 17, 17, 15, 18, 1…
## $ Hospital                             <int> 518, 88, 81, 119, 62, 57, 118, 16…
## $ Consumption_Expenses                 <int> 288835, 260264, 287931, 288513, 2…
## $ Food_Expenses                        <int> 62866, 65269, 67219, 70060, 65816…
## $ Housing_Expenses                     <int> 18854, 16660, 14628, 18515, 13482…
## $ Utility_Expenses                     <int> 23040, 26466, 23591, 22469, 23251…
## $ Clothing_Expenses                    <int> 12801, 9625, 12095, 13941, 10246,…
## $ Healthcare_Expenses                  <int> 13084, 10777, 13259, 13403, 12200…
## $ Transportaion_Communication_Expenses <int> 38017, 33471, 41182, 31549, 45784…
## $ Education_Expenses                   <int> 11854, 11278, 8812, 11837, 12138,…
## $ Entertaiment_Expenses                <int> 32113, 21796, 28980, 31353, 26562…
## $ Other_Consumption_Expenses           <int> 68166, 55839, 69358, 64852, 62401…
  • PositCloudでcsvファイルのアップロードがうまくいかない場合は,以下のコマンドを実行し,githubから直接データを読み込む
pref_data <- read.csv("https://raw.githubusercontent.com/HirokoCogPsy/TDU_DataVis2023/main/Prefectures_Stats_all.csv")

練習問題 3: 高齢者の人数の推移をプロットする

  • プロットのオブジェクト名をp_elder_1とする

  • x軸に年 (Year), y軸に65歳以上の人数 (Population_O65)をとった折れ線グラフを作成する

  • facet_wrap()関数を使い,地域 (Area)で層別化する

    • ncol = 4とし,2行4列で出力
    • geom_line (color = "gray70")とし,線の色を灰色にする
  • 平滑化曲線を局所回帰 (loess)で描画する。その際,線の太さを1.1ポイントに指定し(size = 1.1),信頼区間は描画しない (se = FALSE)

  • y軸をlog10の対数変換し,labels = scales:commaで整数表記にする

  • labs()関数でグラフタイトルや軸名をつける

    • x軸名をYear
    • y軸名をPopulation over 65
    • タイトルをNumber of elderly people on seven regions
# データとマッピングする変数を指定
p_elder_1 <- ggplot(data = pref_data, mapping = aes(x = Year, y = Population_O65))

p_elder_1 <- p_elder_1 + 
  geom_line(color="gray70", aes(group = Prefecture)) +
    geom_smooth(size = 1.1, method = "loess", se = FALSE) +
    facet_wrap(~ Area, ncol = 4) +
    scale_y_log10(labels = scales::comma) + 
    labs(x = "Year",
         y = "Population over 65",
         title = "Number of elderly people on seven regions")

p_elder_1 #プロットの描画
## `geom_smooth()` using formula = 'y ~ x'

  • 現在のプロジェクト(06_datavis)内のfiguresフォルダに,プロット (p_elder_1)をelder_plot1.pngというファイル名で, 高さ12センチ,横幅15センチで保存するように指定する
ggsave(here("figures",           # figuresフォルダを指定
            "p_elder_1.png"),   # 保存するファイル名と形式を指定
              plot = p_elder_1,   # 保存するプロットが格納されたオブジェクトを指定
       height = 12,     # プロットサイズの高さを指定
       width = 15,     # プロットサイズのの横幅を指定
       units = "cm")   # プロットサイズの単位をセンチメートルに指定) 
## `geom_smooth()` using formula = 'y ~ x'